home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / otfile.c < prev    next >
Text File  |  1994-06-01  |  10KB  |  440 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include "otohime.h"
  13. #include "otolib.h"
  14.  
  15. /* mix */
  16. int    mixDialogId = -1 ;
  17. int    mixMesId[30] = -1 ;
  18. int    mixSubDialogId = -1 ;
  19. int    mixDiskVolumeId = -1 ;
  20. int    mixMemoryVolumeId = -1 ;
  21. int    mixDiskNumId = -1 ;
  22. int    mixMemoryNumId = -1 ;
  23. int    mixOkBtnId = -1 ;
  24. int    mixCanBtnId = -1 ;
  25.  
  26. /* rec */
  27. int    recDialogId = -1 ;
  28. int    recMesId[11] = -1 ;
  29. int    recOkBtnId = -1 ;
  30. int    recPlayBtnId = -1 ;
  31. int    recUndoBtnId = -1 ;
  32. int    recCanBtnId = -1 ;
  33. int    recSubDialogId = -1 ;
  34. int    recLineVolumeId = -1 ;
  35. int    recCdVolumeId = -1 ;
  36. int    recMicVolumeId = -1 ;
  37. int    recLineNumId = -1 ;
  38. int    recCdNumId = -1 ;
  39. int    recMicNumId = -1 ;
  40. int    recTimeNumId = -1 ;
  41. int    recRateNumId = -1 ;
  42.  
  43.  
  44. /*    MIX */
  45.  
  46. static int mixFlag ;
  47.  
  48. int    sndMix()
  49. {
  50.     int var, min, max, delta, ptColumn ;
  51.  
  52.     MMI_SendMessage( mixDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  53.     MMI_SendMessage( mixDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  54.  
  55.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  56.  
  57.     MMI_SendMessage( mixDialogId, MM_ERASE, 0 ) ;
  58.     MMI_SendMessage( mixDialogId, MM_DETACH, 0 ) ;
  59.  
  60.     if( mixFlag == TRUE )
  61.     {
  62.         char para[64] ;
  63.         char work[512] ;
  64.  
  65.         MMI_SendMessage( mixMemoryNumId, MM_GETNUMBOX, 5,
  66.                             &var, &min, &max, &delta, &ptColumn ) ;
  67.         DWORD( para + 0 ) = var * 256 / 100 ;
  68.         MMI_SendMessage( mixDiskNumId, MM_GETNUMBOX, 5,
  69.                             &var, &min, &max, &delta, &ptColumn ) ;
  70.         DWORD( para + 4 ) = var * 256 / 100 ;
  71.         DWORD( para + 8 ) = sndBufSize ;
  72.  
  73.         sndMixTrans( sndBuf2, sndBuf1, para, work ) ;
  74.     }
  75.     else
  76.     {
  77.         unDo() ;
  78.     }
  79.  
  80.     return NOERR ;
  81. }
  82.  
  83. /* 各種ボリューム設定 */
  84. int    mixVolumeSet(kobj, messId, argc, pev, trigger)
  85. int        kobj ;
  86. int        messId ;
  87. int        argc ;
  88. EVENT    *pev ;
  89. int        trigger ;
  90. {
  91.     int    var, min, max, len, page ;
  92.     int    var2, min2, max2, delta2, ptColumn2 ;
  93.  
  94.     if( kobj == mixDiskVolumeId )    /* ディスクmixVol. */
  95.     {
  96.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  97.                                         &var, &min, &max, &len, &page ) ;
  98.         MMI_SendMessage( mixDiskNumId, MM_GETNUMBOX, 5,
  99.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  100.         MMI_SendMessage( mixDiskNumId, MM_SETNUMBOX, 5,
  101.                             var, min2, max2, delta2, ptColumn2 ) ;
  102.         MMI_SendMessage( mixDiskNumId, MM_SHOW, 0 ) ;
  103.     }
  104.  
  105.     if( kobj == mixDiskNumId )    /* ディスクmixNum. */
  106.     {
  107.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  108.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  109.         MMI_SendMessage( mixDiskVolumeId, MM_GETSCROLL, 5,
  110.                                         &var, &min, &max, &len, &page ) ;
  111.         MMI_SendMessage( mixDiskVolumeId, MM_SETSCROLL, 5,
  112.                                         var2, min, max, len, page ) ;
  113.         MMI_SendMessage( mixDiskVolumeId, MM_SHOW, 0 ) ;
  114.     }
  115.  
  116.     if( kobj == mixMemoryVolumeId )    /* メモリmixVol. */
  117.     {
  118.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  119.                                         &var, &min, &max, &len, &page ) ;
  120.         MMI_SendMessage( mixMemoryNumId, MM_GETNUMBOX, 5,
  121.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  122.         MMI_SendMessage( mixMemoryNumId, MM_SETNUMBOX, 5,
  123.                             var, min2, max2, delta2, ptColumn2 ) ;
  124.         MMI_SendMessage( mixMemoryNumId, MM_SHOW, 0 ) ;
  125.     }
  126.  
  127.     if( kobj == mixMemoryNumId )    /* メモリmixNum. */
  128.     {
  129.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  130.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  131.         MMI_SendMessage( mixMemoryVolumeId, MM_GETSCROLL, 5,
  132.                                         &var, &min, &max, &len, &page ) ;
  133.         MMI_SendMessage( mixMemoryVolumeId, MM_SETSCROLL, 5,
  134.                                         var2, min, max, len, page ) ;
  135.         MMI_SendMessage( mixMemoryVolumeId, MM_SHOW, 0 ) ;
  136.     }
  137.  
  138.     return NOERR ;
  139. }
  140.  
  141. /* 実行, 取消 */
  142. int    mixOkchk(kobj, messId, argc, pev, trigger)
  143. int        kobj ;
  144. int        messId ;
  145. int        argc ;
  146. EVENT    *pev ;
  147. int        trigger ;
  148. {
  149.     if( kobj == mixOkBtnId )
  150.         mixFlag = TRUE ;
  151.     else
  152.         mixFlag = FALSE ;
  153.     MMI_SetHaltFlag( TRUE ) ;
  154.  
  155.     return NOERR ;
  156. }
  157.  
  158.  
  159. /*    REC */
  160.  
  161. int    sndRec()
  162. {
  163.     int var, min, max, delta, ptColumn ;
  164.  
  165. //    MTL_resetAtrObj( recOkBtnId, ~MS_EVMOSOFFL40 ) ; /* 放したときのexe解除 */
  166. //    MTL_setAtrObj( recOkBtnId, MS_EVMOSONL40 ) ;    /* 押したときにexe */
  167. //    MTL_setAtrObj( recPlayBtnId, (MS_EVMOSONL40 | MS_EVDRAGOUTL40) ) ;
  168. //                                        /* 押したとき,外れたときにもexe */
  169.  
  170.     /* ボリュームセット */
  171.     SND_elevol_mute( 0x00000000 ) ;
  172.     MMI_SendMessage( recLineNumId, MM_GETNUMBOX, 5, /* Line Volune set */
  173.                             &var, &min, &max, &delta, &ptColumn ) ;
  174.     if( var )
  175.         SND_elevol_set( 0, var, var ) ;
  176.  
  177.     MMI_SendMessage( recCdNumId, MM_GETNUMBOX, 5, /* CD Volune set */
  178.                             &var, &min, &max, &delta, &ptColumn ) ;
  179.     if( var )
  180.         SND_elevol_set( 1, var, var ) ;
  181.  
  182.     MMI_SendMessage( recMicNumId, MM_GETNUMBOX, 5, /* Mic Volune set */
  183.                             &var, &min, &max, &delta, &ptColumn ) ;
  184.     if( var )
  185.         SND_elevol_set( 2, var, var ) ;
  186.  
  187.     MMI_SendMessage( recDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  188.     MMI_SendMessage( recDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  189.  
  190.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  191.  
  192.     MMI_SendMessage( recDialogId, MM_ERASE, 0 ) ;
  193.     MMI_SendMessage( recDialogId, MM_DETACH, 0 ) ;
  194.  
  195.     SND_elevol_mute( 0x00000000 ) ;
  196.  
  197.     return NOERR ;
  198. }
  199.  
  200. /* 実行 */
  201. int    recOkchk(kobj, messId, argc, pev, trigger)
  202. int        kobj ;
  203. int        messId ;
  204. int        argc ;
  205. EVENT    *pev ;
  206. int        trigger ;
  207. {
  208.     if( trigger & MS_EVMOSONL40 )
  209.     {
  210.         setMsgColor( recMesId[0], EXE_COLOR ) ;
  211.  
  212.         MG_mosDisp( 2 ) ;
  213.         sndRecExec() ;
  214.         MG_mosDisp( 3 ) ;
  215.  
  216.         setMsgColor( recMesId[0], MOJI_COLOR ) ;
  217.  
  218.         MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  219.     }
  220.     return NOERR ;
  221. }
  222.  
  223. /* 録音実行ルーチン */
  224. int sndRecExec()
  225. {
  226.     SNDHEAD *head ;
  227.     int    i, var1, var2, min, max, delta, ptColumn ;
  228.  
  229.     MMI_SendMessage( recRateNumId, MM_GETNUMBOX, 5,    /* サンプリングレート抽出 */
  230.                             &var1, &min, &max, &delta, &ptColumn ) ;
  231.     MMI_SendMessage( recTimeNumId, MM_GETNUMBOX, 5,    /* 録音時間抽出 */
  232.                             &var2, &min, &max, &delta, &ptColumn ) ;
  233.  
  234.     interrupt_disable() ;    /* 高音質のためインタラプトを掛ける */
  235.     SND_pcm_rec( var1, sndBuf1+32, var1 * var2 / 10, 0 );
  236.     interrupt_enable() ;
  237.  
  238.     head = (SNDHEAD *)sndBuf1 ;        /* ヘッダ書き込み */
  239.     for( i=0 ; i<8 ; i++ )
  240.         head->name[i] = '\0' ;
  241.     head->id = 0 ;
  242.     head->length = var1 * var2 / 10 ;
  243.     head->looppoint = 0 ;
  244.     head->looplength = 0 ;
  245.     head->freq = var1 * 0x62 / 1000 ;
  246.     head->adjust = 0 ;
  247.     head->note = 60 ;
  248.     head->reserve1 = 0 ;
  249.     head->reserve2 = 0 ;
  250.  
  251.     return NOERR ;
  252. }
  253.  
  254. /* 取消 */
  255. int    recCanchk(kobj, messId, argc, pev, trigger)
  256. int        kobj ;
  257. int        messId ;
  258. int        argc ;
  259. EVENT    *pev ;
  260. int        trigger ;
  261. {
  262.     MMI_SetHaltFlag( TRUE ) ;
  263.     return NOERR ;
  264. }
  265.  
  266. /* 再生 */
  267. int    recPlay(kobj, messId, argc, pev, trigger)
  268. int        kobj ;
  269. int        messId ;
  270. int        argc ;
  271. EVENT    *pev ;
  272. int        trigger ;
  273. {
  274.     static int s = 0 ;
  275.     static int lev = 0 ;
  276.  
  277.     if( trigger & MS_EVMOSONL40 )    /* マウスONで消音 */
  278.     {
  279.         if( lev == 0 )
  280.         {
  281.             lev = 1 ;
  282.             SND_get_elevol_mute( &s ) ;
  283.             SND_elevol_mute( 0 ) ;
  284.         }
  285.     }
  286.  
  287.     if( trigger & MS_EVDRAGOUTL40 )    /* オブジェクト外で音の復帰 */
  288.     {
  289.         if( lev == 1 )
  290.         {
  291.             lev = 0 ;
  292.             SND_elevol_mute( s ) ;
  293.         }
  294.     }
  295.  
  296.     if( trigger & MS_EVMOSOFFL40 )    /* マウスOFFで再生開始 */
  297.     {
  298.         if( lev == 0 )
  299.         {
  300.             lev = 1 ;
  301.             SND_get_elevol_mute( &s ) ;
  302.             SND_elevol_mute( 0 ) ;
  303.         }
  304.  
  305.         setMsgColor( recMesId[1], EXE_COLOR ) ;
  306.  
  307.         sndPlay() ;
  308.  
  309.         setMsgColor( recMesId[1], MOJI_COLOR ) ;
  310.  
  311.         SND_elevol_mute( s ) ;
  312.         lev = 0 ;
  313.     }
  314.  
  315.     return NOERR ;
  316. }
  317.  
  318. /* アンドゥ */
  319. int    recUndo(kobj, messId, argc, pev, trigger)
  320. int        kobj ;
  321. int        messId ;
  322. int        argc ;
  323. EVENT    *pev ;
  324. int        trigger ;
  325. {
  326.     setMsgColor( recMesId[2], EXE_COLOR ) ;
  327.  
  328.     unDo() ;
  329.  
  330.     setMsgColor( recMesId[2], MOJI_COLOR ) ;
  331.  
  332.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  333.  
  334.     return NOERR ;
  335. }
  336.  
  337. /* 各種ボリュームの設定 */
  338. int    recVolumeSet(kobj, messId, argc, pev, trigger)
  339. int        kobj ;
  340. int        messId ;
  341. int        argc ;
  342. EVENT    *pev ;
  343. int        trigger ;
  344. {
  345.     int    var, min, max, len, page, s ;
  346.     int    var2, min2, max2, delta2, ptColumn2 ;
  347.  
  348.     MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  349.                                         &var, &min, &max, &len, &page ) ;
  350.  
  351.     if( kobj == recLineVolumeId )    /* ライン入力 */
  352.     {
  353.         MMI_SendMessage( recLineNumId, MM_GETNUMBOX, 5,
  354.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  355.         MMI_SendMessage( recLineNumId, MM_SETNUMBOX, 5,
  356.                             var, min2, max2, delta2, ptColumn2 ) ;
  357.         MMI_SendMessage( recLineNumId, MM_SHOW, 0 ) ;
  358.         SND_elevol_set( 0, var, var );        /* line volume set */
  359.         if( var == 0 )
  360.         {
  361.             SND_get_elevol_mute( &s ) ;
  362.             SND_elevol_mute( s & 0xfffffff3 ) ;
  363.         }
  364.     }
  365.  
  366.     if( kobj == recCdVolumeId )        /* CD */
  367.     {
  368.         MMI_SendMessage( recCdNumId, MM_GETNUMBOX, 5,
  369.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  370.         MMI_SendMessage( recCdNumId, MM_SETNUMBOX, 5,
  371.                             var, min2, max2, delta2, ptColumn2 ) ;
  372.         MMI_SendMessage( recCdNumId, MM_SHOW, 0 ) ;
  373.         SND_elevol_set( 1, var, var );        /* cd volume set */
  374.         if( var == 0 )
  375.         {
  376.             SND_get_elevol_mute( &s ) ;
  377.             SND_elevol_mute( s & 0xffffffcf ) ;
  378.         }
  379.     }
  380.  
  381.     if( kobj == recMicVolumeId )    /* マイク */
  382.     {
  383.         MMI_SendMessage( recMicNumId, MM_GETNUMBOX, 5,
  384.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  385.         MMI_SendMessage( recMicNumId, MM_SETNUMBOX, 5,
  386.                             var, min2, max2, delta2, ptColumn2 ) ;
  387.         MMI_SendMessage( recMicNumId, MM_SHOW, 0 ) ;
  388.         SND_elevol_set( 2, var, var );        /* mic volume set */
  389.         if( var == 0 )
  390.         {
  391.             SND_get_elevol_mute( &s ) ;
  392.             SND_elevol_mute( s & 0xffffffbf ) ;
  393.         }
  394.     }
  395.  
  396.     return NOERR ;
  397. }
  398.  
  399. /* 録音時間 */
  400. int    recTimeSet(kobj, messId, argc, pev, trigger)
  401. int        kobj ;
  402. int        messId ;
  403. int        argc ;
  404. EVENT    *pev ;
  405. int        trigger ;
  406. {
  407.     return NOERR ;
  408. }
  409.  
  410. /* サンプリングレート */
  411. int    recRateSet(kobj, messId, argc, pev, trigger)
  412. int        kobj ;
  413. int        messId ;
  414. int        argc ;
  415. EVENT    *pev ;
  416. int        trigger ;
  417. {
  418.     int timeMax ;
  419.     int    var, min, max, delta, ptColumn ;
  420.  
  421.     /* サンプリングレートから録音時間の最大値を随時設定 */
  422.     MMI_SendMessage( recRateNumId, MM_GETNUMBOX, 5,
  423.                             &var, &min, &max, &delta, &ptColumn ) ;
  424.  
  425.     timeMax = ( sndBufSize - 32 ) / var * 10 ;
  426.  
  427.     MMI_SendMessage( recTimeNumId, MM_GETNUMBOX, 5,
  428.                             &var, &min, &max, &delta, &ptColumn ) ;
  429.     max = timeMax ;
  430.     if( var > max )
  431.         var = max ;
  432.     MMI_SendMessage( recTimeNumId, MM_SETNUMBOX, 5,
  433.                             var, min, max, delta, ptColumn ) ;
  434.     MMI_SendMessage( recTimeNumId, MM_SHOW, 0 ) ;
  435.  
  436.     return NOERR ;
  437. }
  438.  
  439.  
  440.